package Snake;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class Gamepanel extends JPanel implements KeyListener, ActionListener {//直接去实现键盘监听事件接口就不用去创建内部类,实现
    //定时器监听接口
    int length;
     int[] snakeX=new int[700];//蛇的坐标
     int[] snakeY=new int[700];
     String direction;//方向
    boolean Gamestate=false;//游戏状态默认停止
    //食物的坐标
    int foodX;int foodY;
    Random random=new Random();//生成随机数种子
    //游戏失败的判断
     boolean Gamefail=false;//默认不失败
    //分数吃一个食物10分
    int results;

    Timer time=new Timer(100,this);//100毫秒刷新一次面板

     public Gamepanel(){
          init();
          this.setFocusable(true);//获取焦点
          this.addKeyListener(this);//键盘监听，因为该类实现了接口所以不用去new一个键盘监听事件
         time.start();//在创建面板时就开始定时器
     }

    //游戏的初始界面数据
     public void init(){
      length=3;
      snakeX[0]=100;snakeY[0]=100;
      snakeX[1]=75;snakeY[1]=100;
      snakeX[2]=50;snakeY[2]=100;
      direction="R";
      //随机在面板上生成一个食物
     foodX=25+25*random.nextInt(30);//x坐标为25然后加一个34以内随机数（因为面板x的总坐标除以25为34）*25
     foodY=25+25*random.nextInt(20);
     results=0;
    }

    @Override
    //画笔
    protected void paintComponent(Graphics g) {
        super.paintChildren(g);//清屏
        setBackground(Color.white);//设置背景为黑色
        Data.head.paintIcon(this,g,20,11);
        g.fillRect(20,75,850,580);
        Data.food.paintIcon(this,g,foodX,foodY);

        if(direction.equals("R")){
        Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);}
        else if(direction.equals("L")){
            Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);}
        else if(direction.equals("U")){
            Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);}
        else if(direction.equals("D")){
            Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);}

        for(int i=1;i<length;i++){
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
        }

        if(Gamestate==false){
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("按下空格键以开始游戏",300,300);
        }
        if(Gamefail){
            g.setColor(Color.RED);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("游戏失败，请按空格键重新开始",300,300);
        }
        g.setColor(Color.BLACK);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("长度:"+length,750,32);
        g.drawString("分数:"+results,750,54);
    }

    @Override
    //键盘监听事件
    public void keyPressed(KeyEvent e) {//按下键盘
         int keyCode = e.getKeyCode();//获取按下的键的码值
        if(keyCode==KeyEvent.VK_SPACE){//如果码值等于空格就将游戏状态取反
            if(Gamefail){
               Gamefail=false;
               init();
            }else{
            Gamestate=!Gamestate;}
            repaint();
        }



        if(keyCode==KeyEvent.VK_UP){//控制方向
            direction="U";
        }else if(keyCode==KeyEvent.VK_DOWN){
            direction="D";
        }else if(keyCode==KeyEvent.VK_LEFT){
            direction="L";
        }else if(keyCode==KeyEvent.VK_RIGHT){
            direction="R";
        }

    }
    @Override
    //事件监听事件
    public void actionPerformed(ActionEvent e) {

        if(snakeX[0]==foodX&&snakeY[0]==foodY){//吃到食物分数加10，长度加1
            length++;
            results+=10;
            foodX=25+25*random.nextInt(33);//x坐标为25然后加一个34以内随机数（因为面板x的总坐标除以25为34）*25
            foodY=75+25*random.nextInt(22);
        }





         if(Gamestate&&Gamefail==false){//如果游戏状态为开始并且游戏失败状态为假时执行
             for(int j=length-1;j>0;j--){
              snakeX[j]=snakeX[j-1];
              snakeY[j]=snakeY[j-1];//蛇的身体的后一节到前一节的位置
             }
             if(direction=="R"){//根据方向转头，身体会跟着头走
                 snakeX[0]=snakeX[0]+25;//每次头的位置向前25个单位即一个格子
                 if(snakeX[0]>=850){ Gamefail=true; }
             }else if(direction=="L"){
                 snakeX[0]=snakeX[0]-25;//每次头的位置向前25个单位即一个格子
                 if(snakeX[0]<=25){ Gamefail=true; }
             }else if(direction=="U"){
                 snakeY[0]=snakeY[0]-25;//每次头的位置向前25个单位即一个格子
                 if(snakeY[0]<=75){ Gamefail=true; }
             }else if(direction=="D"){
                 snakeY[0]=snakeY[0]+25;//每次头的位置向前25个单位即一个格子
                 if(snakeY[0]>=655){ Gamefail=true; }
             }

             repaint();//重新画面板
         }
         //游戏失败的条件判断
        for(int i=length-1;i>0;i--){
            if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){//如果蛇的头撞到身体则游戏失败
                Gamefail=true;
            }
        }

         time.start();//定时器开启
     }

     //无用的方法
    @Override
    public void keyReleased(KeyEvent e) {

    }
    @Override
    public void keyTyped(KeyEvent e) {

    }

}
